/* 
 * File:   AuthService.cpp
 * Author: nahuel
 * 
 * Created on June 5, 2013, 8:20 PM
 */

#include "server_AuthService.h"
#include "server_UsersDB.h"
#include <iostream>

#define     OK                      "OK"
#define     ERROR                   "ERROR"

#define     AUTH_SERVICE_NAME       "AUTH_SERVICE"
#define     AS_AUTH_USER            "AUTH_USER"

const std::string AuthService::_dbPath = "usersdb.xml";

AuthService::AuthService(Sesion* sesion) : Service(AUTH_SERVICE_NAME) {
    _sesion = sesion;    
}

void AuthService::Iniciar() throw (Excepcion&) {}

void AuthService::Finalizar() throw (Excepcion&) {}

void AuthService::mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje) {
    try
    {
        // <AUTH_SERVICE>|<Metodo>|<args>
        
        hidratarMensaje(pMensaje);
        validarIntegridadMensaje();
        
        if (getNombre() != getMensaje()[0]) return;
        
        // Se determina a que accion corresponde el mensaje.
        string metodo = getMensaje()[1];

        if (metodo == AS_AUTH_USER)
        {
            this->autenticarUsuario(pMensajero, getMensaje());
        }        
        else
        {
            // Metodo invalido
            throw 1;
        }
    }
    catch (int &pEx)
    {
        try
        {
            string respuesta = getMensaje()[0];
            respuesta += SEPARADOR_CAMPO;
            respuesta += getMensaje()[1];
            respuesta += SEPARADOR_CAMPO;
            respuesta += ERROR;
            respuesta += SEPARADOR_CAMPO;
            respuesta += "Comando invalido.";
            
            pMensajero->Responder(respuesta);
        }
        catch (Excepcion& pEx)
        {
            std::cerr << pEx.what() << endl;
        }
    }
}

void AuthService::autenticarUsuario(IMensajero* pMensajero, vector<string> &pComando) {
    // <AUTH_SERVICE>|<AUTH_USER>|<username>|<password>
    
    std::string username = pComando[2];
    std::string password = pComando[3];
    
    UsersDB usersDb(AuthService::_dbPath);
    
    if (usersDb.AutenticarUsuario(username, password)) {
        _sesion->Autenticar();
        
        // Mandar rta OK
        string respuesta = getMensaje()[0];
        respuesta += SEPARADOR_CAMPO;
        respuesta += getMensaje()[1];
        respuesta += SEPARADOR_CAMPO;
        respuesta += OK;
        respuesta += SEPARADOR_CAMPO;
        respuesta += "Autenticacion correcta.";

        pMensajero->Responder(respuesta);        
    } else {
        // Mandar rta ERROR
        string respuesta = getMensaje()[0];
        respuesta += SEPARADOR_CAMPO;
        respuesta += getMensaje()[1];
        respuesta += SEPARADOR_CAMPO;
        respuesta += ERROR;
        respuesta += SEPARADOR_CAMPO;
        respuesta += "Username o password invalido.";

        pMensajero->Responder(respuesta);
    }    
}

AuthService::~AuthService() {}

